低延遲主機的設定被改掉,或重開機後沒有套用時,服務不會中斷,也不會觸發告警,只有收發延遲變慢。例如網卡中斷跟回覆程式原本在同一顆 CPU,被分到不同 CPU 之後,收發延遲中位數從 3.89 µs 變成 4.64 µs;kernel bypass 沒生效時,程式改走 kernel 的網路堆疊,中位數從 1.21 µs 變成 4.16 µs。這類問題只能定期跟基線比對才抓得到,這篇把要檢查的設定跟運作指標寫成巡檢腳本,整理成三件事:
下表最後一欄是項目異常時的影響,量過的附上實測數字:
| 設備 | 項目 | 正常值 | 異常時 |
|---|---|---|---|
| 交換器 | 轉發模式 | cut-through | store-and-forward 時,1518 bytes 封包經過交換器多花 1120 ns(量測值從 428.0 ns 變成 1548.0 ns) |
| 交換器 | 收送錯誤、link 斷線次數、出口 discards | 增量 0 | 增量大於 0 表示封包壞掉、link 斷過或封包被丟掉 |
| 交換器 | LANZ 擁塞紀錄 | 佇列沒到上限 | 佇列到上限 5615 segments 時可能已經丟包 |
| 交換器 | IGMP 洪泛狀態 | 跟基線一樣 | 沒有 querier 時,多播洪泛到所有 port |
| 主機 | 開機參數 | CPU 隔離、C-state 關閉 | 閒置時進 C1,中位數多 0.13 到 0.28 µs |
| 主機 | 網卡參數 | rx-usecs 0 | rx-usecs 100,請求每 20 µs 一個、busy poll 關掉時,中位數從 4.35 µs 變成 149.64 µs |
| 主機 | 中斷綁定、程式在哪顆 CPU | 照設計 | 中斷跟程式分開放,中位數從 3.89 µs 變成 4.64 µs;程式被作業系統移到另一顆 CPU 執行,移過去後第一個請求的收發延遲約 15 µs |
| 主機 | kernel bypass 有沒有生效 | onload_stackdump 或 exasock-stat 列得出程式 | 沒生效時中位數從 1.21 µs 變成 4.16 µs |
| 防火牆 | 版本、HA、設定、CPU | 跟基線一樣,CPU 70% 以下 | 延遲的影響明天實測 |
| 頻率 | 跑什麼 | 門檻 | 交給誰 |
|---|---|---|---|
| 即時(監控系統每分鐘取樣) | 錯誤、link 斷線次數、出口 discards、LANZ、防火牆 CPU | 增量大於 0 或佇列到上限列為 P1;CPU 超過 70% 列為 P2 | 值班,P1 在交易時段立即處理 |
| 每天開盤前 | 全部項目 | 設定跟核准過的基線不同、計數器比前一天增加,列為 P2 | 值班,開盤前處理完 |
| 每次變更前後 | 全部項目,加一輪收發延遲量測 | 只有預期中的項目改變;延遲照最後一節的門檻 | 執行變更的人跟審核的人 |
腳本只用 Python 標準函式庫,正式環境的伺服器不用另外安裝套件;登入設備是呼叫系統的 ssh 指令,用 SSH 金鑰認證,設定檔不存放密碼。設備清單是一個設定檔,每台設備寫類型、管理位址、登入帳號跟要檢查的項目:
[sw-lowlat]
type = arista
host = 198.51.100.10
user = inspect
items = forwarding_mode errors discards link_changes lanz igmp config
每次執行分四步:
這些判斷用測試資料驗過,資料多半取自實驗時存下來的交換器、防火牆輸出。同一份資料比兩次,沒有 FAIL 或 WARN;故意改壞 10 個地方,例如轉發模式改成 store-and-forward、出口 discards 增加,每一處都標出預期的 FAIL 或 WARN,以及 P1 或 P2,連不上的設備也會標 FAIL。同樣的異常如果發生在交易時段以外,P1 都會降為 P2。
明天把 FortiGate 防火牆串接進量測路徑,比較硬體加速開啟與關閉時,封包經過防火牆的延遲。